perm filename SCHMAN.TXT[SCH,LSP] blob sn#688839 filedate 1982-11-14 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00007 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	 -*- Mode:LISP -*-
C00017 00003
C00035 00004
C00072 00005
C00097 00006
C00102 00007
C00103 ENDMK
C⊗;
;;; -*- Mode:LISP; -*-
;;; Scheme Documentation

Book:		Scheme Manual, Version 3
;Description:    Contributors to the DECsystem-20 Manual and/or the Scheme Manual:
;                Hal Abelson, Joseph A. Bowbeer, George J. Carrette, Soma Chaudhuri,
;                Bill Chiarchiaro, Christopher P. Hanson, Steven T. Kirsch, 
;                Leigh L. Klotz, Wayne J. Noss, Patrick O'Donnell, Kent M. Pitman,
;                Jon A. Reese, Guillermo Rozas, Kevin B. Theobald, Guy L. Steele, Jr., 
;                Gerald Jay Sussman, Daniel Weise, Jon L. White
Copyright:	Massachusetts Institute of Technology
Break:

No-Left-Hand-Pages:

Chapter:	Special Forms

Begin-Entry:	LAMBDA
SpecialForm:	(LAMBDA (var1 var2 ...) exp1 exp2 ...)
Description:	LAMBDA constructs procedure objects.  It makes an unnamed
                procedure with formal parameters var1, var2, ... and a
                body consisting of exp1, exp2, ....  The procedure object
                is executed by applying it to a number of arguments
                equal to the number of formal parameters.
		In such a procedure application, each formal parameter is
		bound to the value of the corresponding argument supplied to
		the procedure.  This produces an environment 
                frame in which variable
                references in the body of the procedure can be resolved.  
                The expressions in the body are then evaluated
		sequentially and the value of the last is returned as the
                value of the application.
                Free variables of the procedure (i.e. variables occurring 
                in the body of the procedure which are not formal parameters
       		of the procedure) find their values in
                the lexically enclosing environment.
		A LAMBDA combination consists of a LAMBDA expression
                together with argument expressions.
Demo:		;; A lambda expression:
                ;; X, Y are formal parameters.
                ;; +, Z are free variables.
		(LAMBDA (X Y) (+ X Y Z))
	        [LAMBDA-PROCEDURE 143562]

		;; A lambda combination
		((LAMBDA (X) (+ X 3)) 5)
		8

                ;; Name scoping is lexical:
                (((LAMBDA (X) (LAMBDA (Y) (+ X Y))) 3) 4)
                7
End-Entry:	LAMBDA
						      
Page-Break:

Begin-Entry:	LET
SpecialForm:	(LET bindings exp1 exp2 ...)
Description:	LET is used to define and initialize local variables,
                or, in other words, add a new frame of bindings to the
                environment.
                The argument "bindings" is an association list of the
                names of the local variables and the expressions whose
                values will be assigned to these variables.
                The variables are bound to the given values only in the
                body of the LET.  This is called the "scope" of the
		variables (i.e. nothing outside the body of the LET will
                know of the new frame -- thus it is local).
                All of the expressions
                whose values are being named in the LET are evaluated
		in the environment before the new frame is created.
                Therefore, the value of a variable in the bindings list
                will not depend on the new value assigned to a variable
                preceding it in the list.
		The expressions in the body of the LET are
		sequentially evaluated
		and the value of the last one is returned.
                LET is "syntactic sugar" for the LAMBDA combination:
		β((LAMBDA (name1 name2 ...) exp1 exp2 ...) val1 val2 ...)β.
Demo:		(DEFINE X 3)
                (LET ((X 5) (Y (+ X 1)))
		  (+ X Y))
                9
                X
                3

                (LET ((X 3) (Y 4))
		  (LET ((Z (+ X Y)) (X 1))
		    (* X Y Z)))
		28
End-Entry:	LET

Page-Break:

Begin-Entry:	DEFINE
SpecialForm:    (DEFINE name exp)
Description:	Defines name to be a local variable and initializes it to the
                value of exp (name is not evaluated). A special syntax is provided
                for defining named procedures, namely,                        
Code:		(DEFINE (≡name≡ ≡var1≡ ≡var2≡ ...) ≡exp1≡ ≡exp2≡ ...)
Description:	which is equivalent to
Code:		(DEFINE ≡name≡ (LAMBDA (≡var1≡ ≡var2≡ ...) ≡exp1≡ ≡exp2≡)).
Example:        (DEFINE H 4)                    => H
Example:        H                               => 4
Example:        (DEFINE J (LAMBDA (X) (+ 2 X))) => J
Example:        (J 4)                           => 6
Example:	(DEFINE (F X) (+ X 5))		=> F
Example:	(F 23)				=> 28
Example:	(DEFINE (G X Y) (* (F X) X Y)) 	=> G
Example:	(G 3 4)				=> 96
End-Entry:	DEFINE

Begin-Entry:	SET!
SpecialForm:	(⊃SET!⊃ var exp) 
Description:    βSET!β is used to assign a new value to a previously βDEFINEβ'd
       		(or LAMBDA bound) variable.  The value
                of exp becomes the new value of var.  var itself is not
                evaluated.  An error will occur if var has not been
                already βDEFINEβ'd (or LAMBDA bound).  Use of βSET!β is
                rare in well written SCHEME code.
End-Entry:	SET!

Begin-Entry:	IF
SpecialForm:	(IF condition consequent alternative)
Description:    IF is the primitive conditional statement. If condition evaluates
                to non-NIL, the consequent is evaluated, otherwise the alternative
                is evaluated. If no alternative is supplied and the condition
                fails, NIL is returned.
Example:	(IF (NULL? NIL) 'A 'B)			=> A
Example:        (IF (= 3 4) 'yes 'no)                   => no
Example:	(IF NIL 0 (+ 3 4))		        => 7
End-Entry:	IF

Begin-Entry:	SEQUENCE
SpecialForm:	(SEQUENCE exp1 exp2 ...)
Description:	SEQUENCE is used for the evaluation of sequential
		expressions. It evaluates exp1 exp2 ... in order (from left to 
		right!) and returns the value of the last evaluation.  
End-Entry:	SEQUENCE

Page-Break:

Begin-Entry:	COND
SpecialForm:	(COND clause1 clause2 ...)
Description:	COND is a generalized conditional facility.  Each clause is a 
                list (P E1 E2 ...) consisting of a predicate expression, and 
                any number of consequent expressions, E1, E2, ....  The predicate
                expressions are evaluated sequentially until one 
		evaluates to a non-NIL value.  
		Once a non-nil predictate is found, its consequents are
		evaluated sequentially and the value of the last is returned.
		The syntactic token, ELSE, may be used as the predicate part of
                the final clause, causing the consequent sequence of that clause 
                to be evaluated when the predicates of all other clauses evaluate 
                to NIL.
Example:	(COND (NIL 'LOSE) ((ZERO? 1) 3) (ELSE 'WIN))	=> WIN
Example:	(COND ((EQ? 'A 'A) 'SAME) (ELSE 'HUH?))		=> SAME
Example:	(COND ((EQ? 'A 'B) 'FOO))			=> NIL
End-Entry:	COND

Begin-Entry:	QUOTE
SpecialForm:	(QUOTE obj)
Description:	QUOTE returns obj unevaluated.  A symbolic constant is
		notated
		using QUOTE. '≡obj≡ is a syntactic abbreviation for
                (QUOTE obj); both forms are equivalent, but
		the abbreviation is preferable for legibility.
Example:	(QUOTE (A B))	=> (A B)
Example:	(QUOTE (+ 3 5))	=> (+ 3 5)
Example:	'X		=> X
End-Entry:	QUOTE

Begin-Entry:	AND
SpecialForm:	(AND exp1 exp2 ...)
Description:	AND evaluates expressions from left to right and returns
                the value of the last evaluation. If any evaluates to NIL, AND
                returns NIL and the remaining expressions are not evaluated.
Example:	(AND NIL (PRINT 'FOO))	=> NIL ; Nothing is printed
Example:	(AND 'A 'B)		=> B
Example:        (AND (< 3 4) (> 6 5))   => ∀
End-Entry:	AND

Begin-Entry:	OR
SpecialForm:	(OR exp1 exp2 ...)
Description:	OR evaluates
                expressions from left to right. If some expression
                evaluates to a non-NIL value, OR returns the value of that
                expression and the remaining expressions are not evaluated.
                Otherwise, OR returns NIL.
Example:	(OR NIL 'Q)			=> Q
Example:	(OR 'A 'B)			=> A
Example:	(OR (EQ? 'X 'Y) (EQ? 'Z 'Y))	=> NIL
End-Entry:	OR

Page-Break:

Begin-Entry:	NOT
Syntax:		(NOT obj)
Args:		1 arg
Description:	NOT is used to complement a true/false value. NOT evaluates obj
                and returns ∀ if its value is NIL, and returns NIL if its value
                is non-NIL. NOT is equivalent to βNIL?β . The former is often used
                as a logical operator while the latter is used as a predicate.
                Stylistic conventions determine which is more appropriate in a
                particular context.
Example:	(NOT CAR)		=> NIL
Example:	(NOT (EQ? 'A 'B))	=> ∀
End-Entry:	NOT

Begin-Entry:    NIL?
Syntax:         (⊃NIL?⊃ obj)
Args:           1 arg
Description:    βNIL?β is the NIL predicate.  It evaluates obj and returns ∀
                if its value is NIL, and returns NIL if its value is non-NIL.
Example:        (DEFINE A 3)           => A
Example:        (NIL? (EQ? A 3))       => NIL
Example:        (NIL? (EQUAL? A 3))    => ∀
End-Entry:      NIL?

Page-break:



Chapter:	Arithmetic

Begin-Family:	Numerical Functions


Begin-Entry:	+
Syntax:		(+ n1 n2 ...)
Args:		0 or more args
Type:		Procedure
Description:	Returns the sum of its arguments.
End-Entry:	+

Begin-Entry:	1+
Syntax:		(1+ n)
Args:		1 arg
Type:		Procedure
Description:	Adds one to its argument.
End-Entry:	1+

Begin-Entry:	--
Syntax:		(-- n1 n2 n3 ...)
Args:		0 or more args
Type:		Procedure
Description:	Returns the difference of its arguments, n1-n2-n3-...
		When applied to one argument, negates the argument.
Example:	(-- 10)		=> --10
Example:	(-- 3 --7)	=> 10
End-Entry:	--

Begin-Entry:	-1+
Syntax:		(-1+ n)
Args:		1 arg
Type:		Procedure
Description:	Subtracts one from its argument.
End-Entry:	-1+

Begin-Entry:	*
Syntax:		(* n1 n2 ...)
Args:		0 or more args
Type:		Procedure
Description:	Returns the product of its arguments.
End-Entry:	*

Begin-Entry:	/
Syntax:		(/ x1 x2 ...)
Args:		1 or more args
Type:		Procedure
Description:	Divides the first argument by all the subsequent ones.
		When applied to one argument, returns its reciprocal.
                Note: (/ 0) returns 1 while (/ x1 0) gives an error.
Example:        (/ 5)                => 0.2
Example:        (/ 8 4 2)            => 1
End-Entry:	/

Begin-Entry:	QUOTIENT
Syntax:		(QUOTIENT x1 x2)
Args:		2 args
Type:		Procedure
Description:	Integer division. Returns the integer part of the quotient of
		x1 and x2.
Example:	(QUOTIENT 10 5)	        => 2
Example:	(QUOTIENT 11 3)  	=> 3
Example:	(QUOTIENT 10 2.5)	=> 4
End-Entry:	QUOTIENT

Page-Break:

Begin-Entry:	MOD
Syntax:		(MOD x1 x2)
Args:		2 args
Type:		Procedure
Description:	Returns the remainder of dividing x1/x2.
End-Entry:	MOD

Begin-Entry:    REMAINDER
Syntax:         (REMAINDER x1 x2)
Args:           2 args
Type:           Procedure
Description:    Returns the remainder of dividing x1/x2.
End-Entry:      REMAINDER

Begin-Entry:    INTEGER-DIVIDE
Syntax:         (INTEGER-DIVIDE x1 x2)
Args:           2 args
Type:           Procedure
Description:    Returns the dotted pair of the QUOTIENT and REMAINDER of x1
                and x2.
End-Entry:      INTEGER-DIVIDE

Begin-Entry:    GCD
Syntax:         (GCD n1 n2)
Args:           1 or more arguments
Type:           Procedure
Description:    Returns the Greatest Common Divisor of n1 and n2.
End-Entry:      GCD

Begin-Entry:	ABS
Syntax:		(ABS n)
Args:		1 arg
Type:		Procedure
Description:	Absolute value function.
Example:	(ABS -3.2)	=> 3.2
Example:	(ABS 0)		=> 0
Example:	(ABS 3.2)	=> 3.2
End-Entry:	ABS

Begin-Entry:	FLOOR
Syntax:		(FLOOR n)
Args:		1 arg
Type:		Procedure
Description:	Returns the greatest integer, ≡i≡, such that ≡i≡ is
		less than or equal to n.
Example:	(FLOOR 2.4)	=> 2
Example:	(FLOOR -2.4)	=> -3
Example:	(FLOOR 2)	=> 2
End-Entry:	FLOOR

Begin-Entry:    CEILING
Syntax:         (CEILING n)
Args:           1 arg
Type:		Procedure
Description:    Returns the smallest integer, ≡i≡, such that ≡i≡ is
                greater than or equal to n.
Example:        (CEILING 4.2)     => 5
Example:        (CEILING -4.2)    => -4
Example:        (CEILING -4)      => -4
End-Entry:      CEILING

Page-Break:

Begin-Entry:    TRUNCATE
Syntax:         (TRUNCATE n)
Args:           1 arg
Type:		Procedure
Description:    Returns the integer part of the number n. For positive
                numbers, this is the same as FLOOR while for negative
                numbers, this is the same as CEILING.
Example:        (TRUNCATE 2.4)    => 2
Example:        (TRUNCATE -4.2)   => -4
End-Entry:      TRUNCATE

Begin-Entry:    ROUND
Syntax:         (ROUND n)
Args:           1 arg
Type:           Procedure
Description:    Rounds off the number n to the nearest integer. If n is halfway
                between two integers, ROUND selects the larger integer.
Example:        (ROUND 7.8)       => 8
Example:        (ROUND -3.5)      => -3
End-Entry:      ROUND

Begin-Entry:	MAX
Syntax:		(MAX n1 n2 ...)
Args:		1 or more args
Type:		Procedure
Description:	Returns the largest numerical value in its argument
		list.
Example:	(MAX -1 3 0)	=> 3
End-Entry:	MAX

Begin-Entry:	MIN
Syntax:		(MIN n1 n2 ...)
Args:		1 or more args
Type:		Procedure
Description:	Returns the smallest numerical value in its argument list.
Example:	(MIN -1 3 0)	=> -1
End-Entry:	MIN

Page-Break:

Begin-Entry:	SIN
Syntax:		(SIN n)
Args:		1 arg
Type:		Procedure
Description:	Returns the trigonometric sine of the angle n.  n
		is assumed to be given in radians.
End-Entry:	SIN

Begin-Entry:    ASIN
Syntax:         (ASIN y r)
Args:           2 args
Type:		Procedure
Description:    Returns the arcsine, in radians, of y/r. This is the
                measure of the angle of a right triangle with hypotenuse
                of length r and side opposite to angle of length y.
End-Entry:      ASIN

Begin-Entry:	COS
Syntax:		(COS n)
Args:		1 arg
Type:		Procedure
Description:	Returns the trigonometric cosine of the angle n.  n
		is assumed to be given in radians.
End-Entry:	COS

Begin-Entry:    ACOS
Syntax:         (ACOS x r)
Args:           2 args
Type:		Procedure
Description:    Returns the arccosine, in radians, of x/r. This is the
                measure of the angle of a right triangle with hypotenuse
                of length r and side adjacent to angle of length x.
End-Entry:      ACOS

Begin-Entry:    TAN
Syntax:         (TAN n)
Args:           1 arg
Type:		Procedure
Description:    Returns the tangent of the angle n. n is assumed
                to be given in radians.
End-Entry:      TAN

Begin-Entry:	ATAN
Syntax:		(ATAN y x)
Args:		2 args
Type:		Procedure
Description:	Returns the arctangent, in radians, of y/x. This is
                the measure of the angle of the triangle with side
                opposite to angle of length y, and side adjacent to
                angle of length x.
End-Entry:	ATAN

Begin-Entry:	LOG
Syntax:		(LOG n)
Args:		1 arg
Type:		Procedure
Description:	Natural logarithm.  Returns the log, base ≡e≡, of n.
End-Entry:	LOG

Begin-Entry:	EXP
Syntax:		(EXP x)
Args:		1 arg
Type:		Procedure
Description:	Returns ≡e≡ raised to the x power.
End-Entry:	EXP

Begin-Entry:	EXPT
Syntax:		(EXPT x y)
Args:		2 args
Type:		Procedure
Description:	Exponentiation.  Returns x raised to the power of y.
End-Entry:	EXPT

Begin-Entry:	SQRT
Syntax:		(SQRT n)
Args:		1 arg
Type:		Procedure
Description:	Square root.  Returns the squareroot of n.
End-Entry:	SQRT


End-Family:	Numerical Functions

Page-Break:

Begin-Family:	Numerical Predicates

Begin-Entry:	NUMBER?
Syntax:		(⊃NUMBER?⊃ obj)
Args:		1 arg
Type:		Procedure
Description:	Returns ∀ if obj is a number, otherwise returns NIL.
Example:	(NUMBER? 'A)	=> NIL
Example:	(NUMBER? 3)	=> ∀
Example:	(NUMBER? 2.0)	=> ∀
End-Entry:	NUMBER?

Begin-Entry:	INTEGER?
Syntax:		(⊃INTEGER?⊃ obj)
Args:		1 arg
Type:		Procedure
Description:	Predicate; returns ∀ if obj is an integer, otherwise returns
                NIL.
End-Entry:	INTEGER?

Begin-Entry:	ODD?
Syntax:		(⊃ODD?⊃ n)
Args:		1 arg
Type:		Procedure
Description:	Returns ∀ if n is an odd integer, otherwise returns  NIL.
		returned.
End-Entry:	ODD?

Begin-Entry:    EVEN?
Syntax:         (⊃EVEN?⊃ n)
Args:           1 arg
Type:		Procedure
Description:    Returns ∀ if n is an even integer, otherwise returns NIL.
                returned.
End-Entry:      EVEN?

Begin-Entry:	ZERO?
Syntax:		(⊃ZERO?⊃ n)
Args:		1 arg
Type:		Procedure
Description:	Predicate; returns ∀ if n = 0 , otherwise returns NIL.
		n must be a number.
Example:	(ZERO? 0)	=> ∀
Example:	(ZERO? 0.0)	=> ∀
Example:	(ZERO? 65)	=> NIL
End-Entry:	ZERO?

Begin-Entry:	NEGATIVE?
Syntax:		(⊃NEGATIVE?⊃ n)
Args:		1 arg
Type:		Procedure
Description:	Predicate; returns ∀ if n < 0 , otherwise returns NIL.
		n must be a number.
Example:	(NEGATIVE? -238472234234234233)	   => ∀
Example:	(NEGATIVE? 0)  		           => NIL
Example:	(NEGATIVE? 4.5)			   => NIL
End-Entry:	NEGATIVE?

Begin-Entry:	POSITIVE?
Syntax:		(⊃POSITIVE?⊃ n)
Args:		1 arg
Type:		Procedure
Description:	Predicate; returns ∀ if n > 0 , otherwise returns NIL.
		n must be a number.
Example:	(POSITIVE? 4)  	           => ∀
Example:	(POSITIVE? 0.0)	           => NIL
Example:	(POSITIVE? -0.0002)	   => NIL
End-Entry:	POSITIVE?

Page-Break:

Begin-Entry:	=
Syntax:		(= x1 x2 ...)
Args:		2 or more args
Type:		Procedure
Description:	Predicate; returns ∀ if all of the arguments have the same
		numerical magnitude,otherwise returns NIL.  The arguments must
                be numbers.
Example:	(= 3 3.0)			=> ∀
Example:	(= 3.5 3.0)			=> NIL
End-Entry:	=

Begin-Entry:	>
Syntax:		(> x1 x2 ...)
Args:		2 or more args
Type:		Procedure
Description:	Predicate; returns ∀ if each argument is strictly greater than
		all subsequent arguments, otherwise returns NIL.
Example:	(> 3.0 4 5.6)	=> NIL
Example:	(> 5.3 3 2)	=> ∀
Example:	(> 5.3 2 3)	=> NIL
End-Entry:	>

Begin-Entry:    >=
Syntax:         (>= x1 x2 ...)
Args:           2 or more args
Type:		Procedure
Description:    Predicate; returns ∀ if each argument is greater than or equal
                to all subsequent arguments, otherwise returns NIL.
Example:        (>= 4.0 5.0 5.0)   => NIL
Example:        (>= 4.6 3.8 3.8)   => ∀
End-Entry:      >=

Begin-Entry:	<
Syntax:		(< x1 x2 ...)
Args:		2 or more args
Type:		Procedure
Description:	Predicate; returns ∀ if each argument is strictly less than
		all subsequent arguments, otherwise returns NIL.
Example:	(< 3.0 4 5.6)	=> ∀
Example:	(< 5.3 3 2)	=> NIL
Example:	(< 5.3 2 3)	=> NIL
End-Entry:	<

Begin-Entry:    <=
Syntax:         (<= x1 x2 ...)
Args:           2 or more args
Type:		Procedure
Description:    Predicate; returns ∀ if each argument is less than or equal
                to all subsequent arguments, otherwise returns NIL.
Example:        (<= 3 3 4 5.8)   => ∀
Example:        (<= 2 1.7 4 4)   => NIL
End-Entry:      <=

End-Family:	Numerical Predicates

Page-Break:

Begin-Family:	Miscellaneous Numerical Procedures

Begin-Entry:	RANDOM
Syntax:		(RANDOM [n])
Args:		0 or1 args
Type:		Procedure
Description:	Returns a random integer between 0 and n-1, inclusive. If no
                argument is given, RANDOM returns any integer.
End-Entry:	RANDOM

Begin-Entry:	RANDOMIZE
Syntax:		(RANDOMIZE q)
Args:		1 arg
Type:		Procedure
Description:	RANDOMIZE is used to initialize the random number generator.
                If q is NIL, the generator is initialized with an arbitrary
		(random) seed.  Otherwise, q should be an integer and
		the generator is initialized with q as its seed.
End-Entry:	RANDOMIZE

Begin-Entry:	HASH
Syntax:		(HASH object n)
Args:		2 args
Type:		Procedure
Description:	Returns an integer between 0 and n-1, inclusive, which
		can be used as a hash value for object.
Example:	(HASH 'ABC 87)		=> 18
Example:	(HASH 'DEF 87)		=> 69
Example:	(HASH '(A B) 23)	=> 12
End-Entry:	HASH

End-Family:	Miscellaneous Numerical Procedures

Chapter:	Compound Data

Begin-Family:	List Structure Constructors
Description:    The pair is an object which is used to bond two objects together.
                These component objects may be atoms or ,even, pairs.
                Any structure built out of pairs is called a "list structure", but
                confusingly enough, ≡list≡ itself describes a special type of
		structure.
		In a "normal" list, the CDR of each pair is another pair, with
                the exception
                that the CDR of the last pair is a special atom β'εβ, which
		denotes
		the empty list. Thus the elements of a list are stored in the
		CAR slots of its pairs, while the CDR slots are used to link the
		elements together.

Begin-Entry:	CONS
Syntax:		(CONS obj1 obj2)
Args:		2 args
Type:		Procedure
Description:	CONS is the constructor of a pair whose CAR is obj1 and whose CDR
		is obj2.
		By definition, β(CAR (CONS ≡a≡ ≡b≡))β = ≡a≡ and
		β(CDR (CONS ≡a≡ ≡b≡))β = ≡b≡.
                If obj2 is a list, CONS makes a new list
                which has obj1 as its first element and obj2 as the rest of the elements.
Example:	(CONS '(A B) '(C D))	=> ((A B) C D)
Example:	(CONS 'A '(B C))	=> (A B C)
Example:	(CONS 'A 'B)		=> (A . B)
End-Entry:	CONS

Begin-Entry:    CONS*
Syntax:         (CONS* obj1 obj2 ...)
Args:           0 or more args
Type:		Procedure
Description:    CONS* CONSes together an arbitrary number of arguments.CONS*
                constructs a pair whose CAR is obj1 and whose CDR is
                (CONS* obj2 ...) : (CONS obj1 (CONS* obj2 ...)). When it has
                only two arguments, it behaves in the same way as CONS.
Example:        (CONS* 'A 'B 'C)                => (A B . C)
Example:        (CONS* '(A B) 'C '(D E))        => ((A B) C D E)
Example:        (CONS* 'A 'B)                   => (A . B)
End-Entry:      CONS*

Begin-Entry:	LIST
Syntax:		(LIST obj1 obj2 ...)
Args:		0 or more args
Type:		Procedure
Description:    LIST constructs a list whose elements are obj1, obj2,.. etc.
Example:	(LIST 'A 'B 'C)			=> (A B C)
Example:	(LIST '(A B) '3 '(FOO BAR))	=> ((A B) 3 (FOO BAR))
End-Entry:	LIST

End-Family:	List Structure Constructors

Page-Break:

Begin-Family:	List Structure Selectors

Begin-Entry:	CAR
Syntax:		(CAR pair)				
Args:		1 arg					
Type:		Procedure
Description:	CAR selects the CAR component of a pair. If pair is a list,
                the CAR is the first element of the list.
Example:	(CAR '(A))		=> A
Example:	(CAR '(A B))		=> A
Example:	(CAR '((A B) C D))	=> (A B)
Example:	(CAR NIL)		=> NIL	; By convention
Example:	(CAR '((A B) . (C D)))	=> (A B)
Example:	(CAR '(Y . X))		=> Y
End-Entry:	CAR


Begin-Entry:	CDR
Syntax:		(CDR pair)
Args:		1 arg
Type:		Procedure
Description:	CDR selects the CDR component of a pair. If pair is a list,
                the CDR is the list of all of the elements except the first one.
Example:	(CDR '(A))		=> NIL
Example:	(CDR '(A B))		=> (B)
Example:	(CDR '((A B) C D))	=> (C D)
Example:	(CDR NIL)		=> NIL	;By convention
Example:	(CDR '((A B) . (C D)))	=> (C D)
Example:	(CDR '(Y . X))		=> X
End-Entry:	CDR

Begin-Entry:	C...R
Syntax:		(C...R l)
Type:		Procedure
Args:		1 arg
Description:	Short names for up to four levels of CAR/CDR compositions are
                provided in Scheme. eg, (CAAR l) is (CAR (CAR l)) and (CADAAR l)
                is (CAR (CDR (CAR (CAR l)))).
Example:	(CAR '(A (B C) D))		=>	A
Example:	(CADR '(A (B C) D))		=>	(B C)
Example:	(CDDR '(A (B C) D))		=>	(D)
Example:	(CADADR '(A (B C) D))		=>	C
End-Entry:	C...R

End-Family:	List Structure Selectors

Page-Break:

Begin-Family:	List Structure Mutators

Begin-Entry:	SET!-CAR
Syntax:		(⊃SET!-CAR⊃ pair newcar)
Args:		2 args
Type:		Procedure
Description:	Mutates obj so that its CAR becomes newcar.
Example:	(SET! A '(A B))		=> (A B)
Example:	A			=> (A B)
Example:	(SET!-CAR (CDR A) 3)	=> (3)
Example:	A			=> (A 3)
End-Entry:	SET!-CAR

Begin-Entry:	SET!-CDR
Syntax:		(⊃SET!-CDR⊃ pair newcdr)
Args:		2 args
Type:		Procedure
Description:	Mutates obj so that its CDR becomes newcdr.
Example:	(SET! B '(A B C))	=> (A B C)
Example:	(SET!-CDR B 'E)		=> (A . E)
Example:	B			=> (A . E)
End-Entry:	SET!-CDR

End-Family:	List Structure Mutators

Begin-Family:	List Structure Predicates

Begin-Entry:	ATOM?
Syntax:		(⊃ATOM?⊃ obj)
Args:		1 arg
Type:		Procedure
Description:	Atomic predicate that returns ∀ if obj is an atom and otherwise
                returns NIL. In our structure view of the world, pairs are the
                bond by which lists (molecules) are constructed from the basic
                elements, or atoms. An atom is anything which cannot be further
                decomposed via CAR or CDR  ; in other words, everything that is
                not a pair is an atom.
Example:	(ATOM? 3)	=> ∀
Example:	(ATOM? NIL)	=> ∀
Example:	(ATOM? 'CAR)	=> ∀
Example:	(ATOM? CAR)	=> ∀
Example:	(ATOM? '(A 3))	=> NIL
End-Entry:	ATOM?

Page-Break:

Begin-Entry:	SYMBOL?
Syntax:		(⊃SYMBOL?⊃ obj)
Args:		1 arg
Type:		Procedure
Description:	βSYMBOL?β is a predicate that returns ∀ if obj is an
		atomic symbol (variable or NIL), otherwise returns NIL.
Example:	(SYMBOL? 3)	=> NIL
Example:	(SYMBOL? 'CAR)	=> ∀
Example:	(SYMBOL? CAR)	=> NIL
Example:	(SYMBOL? NIL)	=> ∀
End-Entry:	SYMBOL?

Begin-Entry:	PAIR?
Syntax:		(⊃PAIR?⊃ obj)
Args:		1 arg
Type:		Procedure
Description:	βPAIR?β is a predicate that returns ∀ if obj is of datatype
                βPAIRβ. It is the same as βLIST?β except in the case of β'εβ.
                β'εβ represents the empty list which is a list but not a pair.
Example:	(PAIR? '(A B))	   => ∀
Example:	(PAIR? 'ε)    	   => NIL
Example:	(PAIR? 'A)	   => NIL
Example:        (PAIR? '(A . B))   => ∀
End-Entry:	PAIR?

Begin-Entry:	LIST?
Syntax:		(⊃LIST?⊃ obj)
Args:		1 arg
Type:		Procedure
Description:	βLIST?β is a predicate that is used to determine whether
                an object is a list.  For reasons of efficiency, βLIST?β employs
                a very weak rule, namely, an object is considered a list if it
                is a pair (even a dotted pair) or β'εβ, the empty list, i.e.,
                β(LIST? ≡obj≡)β ≡↔≡ β(OR (EMPTY? ≡obj≡) (PAIR? ≡obj≡))β
                Thus if βLIST?β returns NIL, the object is definitely not a list,
                but if it returns ∀,the object may not be a list in the strict
                sense of the term. The dotted pair in the last example below
                is not really a list.
		Note: Many programs, such as APPEND, construct structure using CONS.
Example:	(LIST? 'A)	 => NIL
Example:	(LIST? 'ε)	 => ∀
Example:	(LIST? '(A B))	 => ∀
Example:        (LIST? '(A . B)) => ∀
End-Entry:	LIST?

Begin-Entry:	NULL?
Syntax:		(⊃NULL?⊃ obj)
Args:		1 arg
Type:		Procedure
Description:	βNULL?β is the empty list predicate which returns ∀ if obj
                is β'εβ, and NIL if obj is non-β'εβ.
Example:	(NULL? '(A B C))			=> NIL
Example:        (NULL? 'ε)                             => ∀
Example:        (NULL? NIL)                             => ∀
End-Entry:	NULL?

Page-Break:

Begin-Entry:	EQ?
Syntax:		(⊃EQ?⊃ obj1 obj2)
Args:		2 args
Type:		Procedure
Description:  	βEQ?β is the primitive equivalence predicate. It returns ∀
                if obj1 and obj2 are the same object.
		Unless you are rather
		advanced, do not use βEQ?β to test identity of objects other
		than atomic symbols.  In particular, two numbers which are
		equal in value may not be βEQ?β -- use "=" to test numerical
		equality.  Also, two lists which have the same elements and
		print the same may not be βEQ?β -- use EQUAL? to test if lists
		have the same elements.
Description:	For more advanced users only:  Two structures are βEQ?β if
		any attempt to modify one of them modifies the other in
		the same way. From a pragmatic point of view, βEQ?β tests if the
                two structures share the same location in the memory space.
Example:	(DEFINE X '(A B))		=> X
Example:	(DEFINE Y '(A B))		=> Y
Example:	(DEFINE Z X)			=> Z
Example:	(EQ? X Y)			=> NIL
Example:	(EQ? X Z)			=> ∀
Example:	(EQ? Y Z)			=> NIL
Example:	(SET! X 'FOO)			=> FOO
Example:	(SET! Y 'FOO)			=> FOO
Example:	(SET! Z X)			=> FOO
Example:	(EQ? X Y)			=> ∀
Example:	(EQ? X Z)			=> ∀
Example:	(EQ? Y Z)			=> ∀
Example:	(EQ? 1000 1000) 		=> NIL
End-Entry:	EQ?

Begin-Entry:	EQUAL?
Syntax:		(⊃EQUAL?⊃ obj1 obj2)
Args:		2 args
Type:		Procedure
Description:	βEQUAL?β is a list structure equivalence predicate which
                returns ∀ if both args are βEQ?β atoms, or are lists
		of the same length and component-wise βEQUAL?β.
		That is, βEQUAL?β lists
                have an identical arrangement of atoms, with each such
                atom in obj1 being βEQ?β to the corresponding
		atom in obj2.
		As illustrated below, βEQ?β and βEQUAL?β are quite different.
Example:	(EQ? '(A B) '(A B))		=> NIL
Example:	(EQUAL? '(A B) '(A B))		=> ∀
Example:        (DEFINE X '(A B))               => (A B)
Example:        (DEFINE Y '(A B))               => (A B)
Example:        (EQUAL? X Y)                    => ∀
Example:	(EQUAL? 3 3)			=> ∀
End-Entry:	EQUAL?

End-Family:	List Structure Predicates

Page-Break:

Begin-Family:	Commonly Useful List Functions

Begin-Entry:	NTHCDR
Syntax:		(NTHCDR n l)
Args:		2 args
Type:		Procedure
Description:	NTHCDR selects the nth CDR of the list l.
                (if n is 0, l is returned).
Example:	(NTHCDR 0 '(A B))	=> (A B)
Example:	(NTHCDR 2 '(A B C D))	=> (C D)
End-Entry:	NTHCDR

Begin-Entry:    NTH
Syntax:         (NTH n l)
Args:           2 args
Type:		Procedure
Description:    NTH is the short form for β(CAR (NTHCDR ≡n≡ ≡l≡))β.
		It selects the (n+1)th element of the list l.
		If n=0, NTH returns the CAR of the argument.
Example:        (NTH 0 '(A B C D))      => A
Example:        (NTH 2 '(A B C))        => C
Example:        (NTH 4 '(A B))          => NIL
End-Entry:      NTH

Begin-Entry:    LAST
Syntax:         (LAST list)
Args:           1 arg
Type:           Procedure
Description:    Returns a list containing the last element of ≡list≡.
Example:        (LAST '(A B C))         => (C)
End-Entry:      LAST

Begin-Entry:	LENGTH
Syntax:		(LENGTH l)
Args:		1 arg
Type:		Procedure
Description:	Returns the length of its argument l, which must be a list.
Example:	(LENGTH NIL)		=> 0
Example:	(LENGTH '(A B C))	=> 3
Example:	(LENGTH '(A B C . D))	=> 3
End-Entry:	LENGTH

Begin-Entry:	APPEND
Syntax:		(APPEND l1 l2 ...)
Args:		0 or more args
Type:		Procedure
Description:	Constructs a list whose elements are, in order,
		the elements of each of the lists given as its
		arguments.  Cf. βLISTβ.
Example:	(APPEND '(A) '(B C) '(D))	=> (A B C D)
Example:	(APPEND '((A B) C) '((D E)))	=> ((A B) C (D E))
Example:	(APPEND '(A B) NIL)		=> (A B)
End-Entry:	APPEND

Page-Break:

Begin-Entry:	REVERSE
Syntax:		(REVERSE l)
Args:		1 arg
Type:		Procedure
Description:	Constructs a list which contains the elements of the list l
                in reverse order.
Example:	(DEFINE A '(A B C))	=> A
Example:	(REVERSE A)		=> (C B A)
Example:	A			=> (A B C)
Example:	(REVERSE '(A (B C) D))  => (D (B C) A)
End-Entry:	REVERSE

Begin-Entry:    CONC!
Syntax:         (⊃CONC!⊃ list1 list2)
Args:           2 args
Type:		Procedure
Description:    Mutates list1 so that it includes all the elements of the original
                list1 and the elements of list2 in that order. βCONC!β is
                similar to APPEND except that it is a mutator while APPEND is
                a constructor.
Example:        (DEFINE l1 '(A B))              => l1
Example:        (DEFINE l2 '(C D))              => l2
Example:        (APPEND l1 l2)                  => (A B C D)
Example:        l1                              => (A B)
Example:        l2                              => (C D)
Example:        (CONC! l1 l2)                   => (A B C D)
Example:        l1                              => (A B C D)
Example:        l2                              => (C D)
End-Entry:      CONC!

Begin-Entry:    MAPCAR
Syntax:         (MAPCAR fn list)
Args:           2 args
Type:           Procedure
Description:    Applies fn to each element of ≡list≡  and returns a list of
                the results.
Example:        (MAPCAR length '((a b) (c d . e) (e (f g) h)))    => (2  2  3)
End-Entry:      MAPCAR

Begin-Entry:    MAPCAN
Syntax:         (MAPCAN fn list)
Args:           2 args
Type:           Procedure
Description:    Applies fn to each element of ≡list≡ and returns a list which
                is the CONC! of the results. Each result, of course, has to be
                a list.
End-Entry:      MAPCAN

End-Family:	Commonly Useful List Functions

Page-Break:

Begin-Family:	Lists as sets and tables

Begin-Entry:	MEMQ
Syntax:		(MEMQ obj list)
Args:		2 args
Type:		Procedure
Description:	Using EQ?, tests each object in list to see
		if it is the same as obj.  Returns the first sublist of list beginning
		with obj, or NIL if obj doesn't occur in list.
Example:	(MEMQ 'B '(A B C A B C))	=> (B C A B C)
Example:	(MEMQ 'Q '(A B C A B C))	=> NIL
Example:	(MEMQ 'A '((A B) A D))		=> (A D)
Example:	(MEMQ '(A B) '(A (A B) C))	=> NIL
End-Entry:	MEMQ

Begin-Entry:	MEMBER
Syntax:		(MEMBER obj list)
Args:		2 args
Type:		Procedure
Description:	Using EQUAL?, tests each object in list to see
		if it is the same as obj. Returns the first sublist of list beginning
		with obj, or NIL if obj doesn't occur in list.
Example:	(MEMBER '(A B) '(A (A B) C))	=> ((A B) C)
Example:	(MEMBER 'B '(A B C))		=> (B C)
Example:	(MEMBER 3.0 '(3 4 5))		=> (3 4 5)
End-Entry:	MEMBER

Begin-Entry:	ASSQ
Syntax:		(ASSQ obj alist)
Args:		2 args
Type:		Procedure
Description:	alist is presumed to be a list of pairs representing a table.
		The CAR of each pair is the key to the table and the CDR is the
		information stored in the table under that key.  ASSQ tests each pair in alist
		to see
		if its CAR is EQ? to OBJ.  ASSQ returns the first element of
		alist whose CAR is obj, or NIL if obj doesn't occur in the CAR
		of any element of alist.  Thus ASSQ is useful for table lookup if the keys
		are atomic symbols.
Example:	(ASSQ 'A '((D E) (A B) (C D)))		=> (A B)
Example:	(ASSQ '(A B) '((D E) ((A B) C) (B D)))	=> NIL	;see below
End-Entry:	ASSQ

Begin-Entry:	ASSOC
Syntax:		(ASSOC obj alist)
Args:		2 args
Type:		Procedure
Description:	alist is presumed to be a list of pairs representing a table.
		The CAR of each pair is the key to the table and the CDR is the
		information stored in the table under that key.  ASSOC tests each pair in alist
		to see
		if its CAR is EQUAL? to OBJ.  ASSOC returns the first element of
		alist whose CAR is obj, or NIL if obj doesn't occur in the CAR
		of any element of alist.  Thus ASSOC is useful for table lookup in situations
		where the table keys are not symbols.
Example:	(ASSQ '(A B) '((D E) ((A B) C) (B D)))	=> ((A B) C)
Example:	(ASSOC 3 '((1 A) (2 B) (3 C))) => (3 C)
Example:	(ASSOC 4 '((1 A) (2 B) (3 C))) => NIL
End-Entry:	ASSOC

End-Family:	Lists as sets and tables

Page-Break:

Begin-Family:	Arrays
Description:    There are two sets of commands for creating and using arrays.
		MAKE-ARRAY and AMAKE are similar
                in that they both create initialized arrays.
		SET!-ARRAY and ASET! are
                similar in that they are both used to assign values to the cells
                in arrays.  ACCESS-ARRAY and AREF are similar in that they are both
                used to retrieve values from the cells in arrays.  However, they differ
                in the way cells are referenced.  In MAKE-ARRAY, SET!-ARRAY and
                ACCESS-ARRAY, the cell is specified by one argument, a list of the
                coordinates of the cell.  AMAKE, ASET! and AREF, on the other
                hand, accept the coordinates as individual arguments. Though the
                syntax used in the former case is more systematic and consistent,
                the syntax of the latter case is easier for typing.

Begin-Entry:	MAKE-ARRAY
Syntax:		(MAKE-ARRAY bounds initproc)
Args:		2 args
Type:		Procedure
Description:	Constructs an array with the given bounds and initializes
                cells as specified by initproc. The variable "bounds" is a list of integers,
                each of whose elements gives the  number of distinct subscript
                values for the corresponding dimension.  Arrays in
		SCHEME are zero-based; the maximum subscript along any
		dimension is one less than the bound.  initproc is a procedure
                of one argument, a list of coordinates identifying one array
                cell, which computes the initial value for that array cell.
                initproc can be NIL, in which case the array is not initialized.
End-Entry:	MAKE-ARRAY

Begin-Entry:	ACCESS-ARRAY
Syntax:         (ACCESS-ARRAY a coords)
Args:           2 args
Type:		Procedure
Description:    Returns the value located in the cell of the array, a,
                specified by coords, the list of subscript values i1, i2, ...
End-Entry:	ACCESS-ARRAY

Begin-Entry:	SET!-ARRAY
Syntax:		(⊃SET!-ARRAY⊃ a coords val)
Args:		3 args
Type:		Procedure
Description:	Stores val into the cell of the array, a, specified by coords,
                the list subscript values i1, i2, ...
Example:	(DEFINE A
		  (MAKE-ARRAY '(10 20)
			      (LAMBDA (coords)
				(+ (CAR coords) (CADR coords))))) => A
Example:	(ACCESS-ARRAY A '(9 17)) => 26
Example:	(SET!-ARRAY A '(3 14) 'FOO) => FOO
Example:	(ACCESS-ARRAY A '(3 14)) => FOO
Example:	(DEFINE B (MAKE-ARRAY '(5 5) NIL)) => B
Example:	(SET!-ARRAY B '(2 1) 'BAR) => BAR
Example:	(ACCESS-ARRAY B '(2 1)) => BAR
End-Entry:	SET!-ARRAY

Page-Break:

Begin-Entry:	DIMENSIONS-ARRAY
Syntax:		(DIMENSIONS-ARRAY a)
Args:		1 arg
Type:		Procedure
Description:	Returns a list of the bounds of the array, a.
Example:	(DIMENSIONS-ARRAY (MAKE-ARRAY '(3 5) NIL))	=> (3 5)
End-Entry:	DIMENSIONS-ARRAY

Begin-Entry:	ARRAY?
Syntax:		(⊃ARRAY?⊃ obj)
Args:		1 arg
Type:		Procedure
Description:	Predicate; returns ∀ if obj is an βARRAYβ, otherwise returnsNIL.
Example:	(DEFINE A (MAKE-ARRAY '(10) NIL)) => A
Example:	(ARRAY? A) => ∀
Example:	(ARRAY? 'A) => NIL
End-Entry:	ARRAY?

Begin-Entry:    AMAKE
Syntax:         (AMAKE initproc bound1 bound2 ...)
Args:           2 or more args
Type:		Procedure
Description:    Constructs an array with the given bounds. initproc,
                a procedure of n arguments (where n is the order of
		the array), is used to initialize the array. When
                initproc is NIL, the array is not initialized.
End-Entry:      AMAKE

Begin-Entry:    AREF
Syntax:		(AREF a i1 i2 ...)
Args:		2 or more args
Type:		Procedure
Description:	Returns the value located in the cell of the array, a,
		specified by the subscripts i1, i2, ...
End-Entry:	AREF

Begin-Entry:    ASET!
Syntax:		(⊃ASET!⊃ val a i1 i2 ...)
Args:		3 or more args
Type:		Procedure
Description:	Stores val into the cell of the array, a, specified by the
		subscripts i1, i2, ...
Example:	(DEFINE A (AMAKE (LAMBDA (X Y) (+ X Y)) 5 8)) => A
Example:	(AREF A 3 7) => 10
Example:	(ASET! 'FOO A 3 3) => FOO
Example:	(AREF A 3 3) => FOO
End-Entry:      ASET!

End-Family:	Arrays

Page-Break:

Begin-Family:	Properties

Begin-Entry:	PUT!-PROP
Syntax:		(⊃PUT!-PROP⊃ sym propname val)
Args:		3 args
Type:		Procedure
Description:	βPUT!-PROPβ is used to specify the properties of an atomic symbol.
                It assigns val to the propname of sym.
End-Entry:	PUT!-PROP

Begin-Entry:	GET-PROP
Syntax:		(GET-PROP sym propname)
Args:		2 args
Type:		Procedure
Description:	GET-PROP is used to retrieve properties of atomic symbols. It
                gets the value of the propname of sym.
End-Entry:	GET-PROP

Begin-Entry:	REMOVE!-PROP
Syntax:		(⊃REMOVE!-PROP⊃ sym propname)
Args:		2 args
Type:		Procedure
Description:	βREMOVE!-PROPβ is used to remove properties of atomic symbols.
		It removes the value assigned to the propname of sym. If sym had such a
                value, the value is returned; otherwise NIL is returned.
End-Entry:	REMOVE!-PROP

Begin-Entry:	LIST-PROP
Syntax:		(LIST-PROP sym)
Args:		1 arg
Type:		Procedure
Description:	LIST-PROP returns an association list representing the property
                list of sym. This association list has the form:
                (...(propname2 val2) (propname1 val1)).
Example:	(LIST-PROP 'JOE)		  => NIL
Example:	(PUT!-PROP 'JOE 'FATHER 'ARTHUR)  => ARTHUR
Example:	(LIST-PROP 'JOE)	          => ((FATHER ARTHUR))
Example:	(PUT!-PROP 'JOE 'MOTHER 'ANNE)    => ANNE
Example:	(LIST-PROP 'JOE)	          => ((MOTHER ANNE) (FATHER ARTHUR))
Example:	(GET-PROP 'JOE 'MOTHER)		  => ANNE
Example:	(REMOVE!-PROP 'JOE 'MOTHER)       => ANNE
Example:	(LIST-PROP 'JOE)	       	  => ((FATHER ARTHUR))
End-Entry:	LIST-PROP

End-Family:	Properties

Page-Break:

Begin-Family:	Miscellaneous

Begin-Entry:	PRIMITIVE-TYPE
Syntax:		(PRIMITIVE-TYPE obj)



Args:		1 arg
Type:		Procedure
Description:    Returns the datatype of obj.
Example:	(PRIMITIVE-TYPE 3)	  	         => NUMBER
Example:	(PRIMITIVE-TYPE 'A)	      	         => SYMBOL
Example:	(PRIMITIVE-TYPE NIL)		         => NULL
Example:	(PRIMITIVE-TYPE '(A B))		         => PAIR
Example:	(PRIMITIVE-TYPE CAR)		         => PRIMITIVE-PROCEDURE
Example:	(PRIMITIVE-TYPE TOP-LEVEL-ENVIRONMENT)   => ENVIRONMENT
Example:	(PRIMITIVE-TYPE (MAKE-ARRAY '(2 3) NIL)) => ARRAY
End-Entry:	PRIMITIVE-TYPE

Begin-Entry:	EXTEND?
Syntax:		(⊃EXTEND?⊃ obj)
Args:		1 arg
Type:		Procedure
Description:	βEXTEND?β is a predicate which returns ∀ if obj is neither an
                atom or a list, and returns NIL otherwise.  Procedures, arrays,
                and environment representations are all extended objects.
Example:	(EXTEND? CAR)		=> ∀
Example:	(EXTEND? 'CAR)		=> NIL
End-Entry:	EXTEND?

Begin-Entry:	APPLICABLE?
Syntax:		(⊃APPLICABLE?⊃ obj)
Args:		1 arg
Type:		Procedure
Description:	βAPPLICABLE?β is a predicate which returns ∀ if obj is either
                a primitive or compound procedure.
Example:	(APPLICABLE? CAR)		=> ∀
Example:	(APPLICABLE? (LAMBDA (X) X))	=> ∀
End-Entry:	APPLICABLE?

Begin-Entry:	ALPHALESS?
Syntax:		(⊃ALPHALESS?⊃ sym1 sym2)
Args:		2 args
Type:		Procedure
Description:	Both arguments must be atomic symbols. βALPHALESS?β returns
                ∀ if sym1 precedes sym2 in alphabetical order, otherwise
		returns NIL.  (Note that ASCII values are used for
		ordering, which means that lowercase letters, digits,
		or other odd characters may cause unexpected results
		for those not familiar with the table of ASCII codes.)
Example:	(ALPHALESS? 'COT 'CAT)	 => NIL
Example:	(ALPHALESS? 'ANT 'AXE)	 => ∀
Example:        (ALPHALESS? 'SAME 'SAME) => NIL
End-Entry:	ALPHALESS?

End-Family:	Miscellaneous


Chapter:	System Support

Begin-Entry:	LOAD
Syntax:		(LOAD filename [echo])
Args:		1 or 2 args
Type:		Procedure
Description:	Reads and evaluates sequentially each of the expressions in
		the specified filename.  If echo is provided, and is non-NIL,
		the value of each expression will be typed on the console as
		it is loaded.
End-Entry:	LOAD

Begin-Entry:	PP
Syntax:		(PP expression)
Args:		1 arg
Type:		Procedure
Description:	PP is the pretty-printer which prints out the expression in a
                nice form, so as to show up its structure easily.
End-Entry:	PP

Begin-Entry:	PHOTO
Syntax:		(PHOTO filename)
Args:		1 arg
Type:		Procedure
Description:	Used in conjunction with TOFU and the TOPS-20 PRINT
		command to produce a hardcopy listing of your console
		session.  PHOTO begins recording the console session;
		file filename is created to hold the photo.  The TOFU
		command is used to stop the recording process.  The
		TOPS-20 PRINT command should be used to actually print
		the photo on the lineprinter.
End-Entry:	PHOTO

Begin-Entry:	TOFU
Syntax:		(TOFU)
Args:		No args
Type:		Procedure
Description:	Closes the photo file and stops the recording process.
End-Entry:	TOFU

Begin-Entry:	BKPT
Syntax:		(BKPT message irritant)
Args:		2 args
Type:		Procedure
Description:	Sets a breakpoint -- useful in debugging.
		message and irritant are typed and a breakpoint is set in the
                current environment. Within a breakpoint, expressions may be
                typed and will be evaluated in the breakpoint environment.To
		exit from the breakpoint and proceed with the
		interrupted process, type the symbol β$Pβ (escape P)
		followed by a space.

Demo:	       	==> (SEQUENCE (PRINT 'FOO) (BKPT 'TEST-2 TEST-3) (PRINT 'BAR) 'DONE)
		FOO
	        Bkpt! TEST-2 TEST-3 Level : 2

                Bkpt-> (+ 3 3)
                6

                Bkpt-> $P
		BAR
		DONE
End-Entry:	BKPT

Page-Break:

Begin-Entry:	ERROR
Syntax:		(ERROR message irritant)
Args:		2 args
Description:	Signals an error.  Types message (and irritant) on the console
                and
		creates a debugging breakpoint in the current environment.
		message is a description of the error and irritant is the
		offending expression, or "irritant".
End-Entry:	ERROR

Begin-Entry:	QUIT
Syntax:		(QUIT)
Args:		No args
Type:		Procedure
Description:	Suspend SCHEME and return to the TOPS-20 monitor.  QUIT
		doesn't reset the SCHEME fork.
End-Entry:	QUIT

Begin-Entry:	EDIT
Syntax:		(EDIT)
Type:		Procedure
Description:	Internal link to the text editor.  Requests that
		SCHEME suspend itself temporarily and transfer to
		the editor, EMACS.  Once in EMACS, make necessary fixes and use
		one or more of the following commands to send the
		altered code back to SCHEME.  Note:  EMACS
		automatically saves your buffer before returning to SCHEME.
Display:	{esc}Z	Mark current DEFINE for eventual transmission back to SCHEME.
		↑X Z	Return to Scheme, sending any marked DEFINE's.
		↑Z Y	Transmit the current DEFINE back to SCHEME -- a combination of {esc}Z and ↑X Z.
		{esc}O	Transmit entire buffer back to SCHEME.
End-Entry:	EDIT

Begin-Family:	Advising Procedures

Description:	Giving advice to procedures is a powerful debugging
		technique.  TRACE and BREAK are familiar examples of
		advice-giving procedures.  The global variable
		*ADVISED-PROCEDURES* lists the procedures which have
		been advised.

Begin-Entry:	TRACE-ENTRY
Syntax:		(TRACE-ENTRY proc)
Args:		1 arg
Type:		Procedure
Description:	Causes an informative message to be printed whenever
		the procedure proc is entered.  The message is of the
		form "[Entering (fn v1 v2 ...)]", where "v1 v2 ..." is
		the list of values for the procedure's parameters.
End-Entry:	TRACE-ENTRY

Begin-Entry:	TRACE-EXIT
Syntax:		(TRACE-EXIT proc)
Args:		1 arg
Type:		Procedure
Description:	Causes an informative message to be printed when
		procedure proc terminates.  The message contains the
		procedure, its argument values, and the value of the
		last expression evaluated.
End-Entry:	TRACE-EXIT

Begin-Entry:    UNTRACE-ENTRY
Syntax:         (UNTRACE-ENTRY [proc])
Args:           0 or 1 args
Type:           Procedure
Description:    Stops TRACing whenever the procedure proc is entered.
                If TRACE and UNTRACE-ENTRY are applied to proc in that
                order, it will be TRACEd only when proc terminates.
                When no procedure is specified, UNTRACE-ENTRY applies
                to all procedures which have been TRACEd.
End-Entry:      UNTRACE-ENTRY

Page-Break:

Begin-Entry:    UNTRACE-EXIT
Syntax:         (UNTRACE-EXIT [proc])
Args:           0 or 1 args
Type:           Procedure
Description:    Stops TRACing when the procedure proc terminates. If
                TRACE and TRACE-EXIT are applied to proc in that order,
                it will be TRACEd only when proc is entered. When no
                procedure is specified, UNTRACE-EXIT applies to all
                procedures which have been TRACEd.
End-Entry:      UNTRACE-EXIT


Begin-Entry:	BREAK-ENTRY
Syntax:		(BREAK-ENTRY proc)
Args:		1 arg
Type:		Procedure
Description:	Like βTRACE-ENTRYβ with the additional effect
		that a breakpoint is entered when procedure proc is
		invoked.  proc and its arguments are saved in the
		global variables *PROC* and *ARGS*, respectively, for
		easy access inside the breakpoint.
End-Entry:	BREAK-ENTRY

Begin-Entry:	BREAK-EXIT
Syntax:		(BREAK-EXIT proc)
Args:		1 arg
Type:		Procedure
Description:	Like βTRACE-EXITβ with the additional effect that
		a breakpoint is entered just prior to leaving
		procedure proc.  proc, its arguments, and the result
		are saved in the global variables *PROC*, *ARGS*, and
		*RESULT*, respectively, for easy access inside the
		breakpoint.  The result computed by proc is
		automatically returned from the breakpoint, but the user
		may return any value by setting *RESULT* prior to proceeding
		via $p.
End-Entry:	BREAK-EXIT

Begin-Entry:	TRACE
Syntax:		(TRACE proc)
Args:		1 arg
Type:		Procedure
Description:	TRACEs proc both when it is invoked and when it
		terminates.  A combination of TRACE-ENTRY and TRACE-EXIT.
End-Entry:	TRACE

Begin-Entry:    UNTRACE
Syntax:         (UNTRACE [proc])
Args:           0 or 1 arg
Type:           Procedure
Description:    Stops TRACing procedure both when it is invoked and
                when it terminates. When no procedure is specified,
                UNTRACE applies to all procedures which have been TRACEd.
                A combination of UNTRACE-ENTRY and UNTRACE-EXIT.
End-Entry:      UNTRACE

Begin-Entry:	BREAK
Syntax:		(BREAK proc)
Args:		1 arg
Type:		Procedure
Description:	Sets a breakpoint at the beginning and at the end of
		proc.  A combination of both βBREAK-ENTRYβ and
		βBREAK-EXITβ.
End-Entry:	BREAK

Page-Break:

Begin-Entry:	ADVISE-ENTRY
Syntax:		(ADVISE-ENTRY proc advice)
Args:		2 args
Type:		Procedure
Description:	General entry-advising procedure.  TRACE-ENTRY and
		BREAK-ENTRY are examples of entry-advising procedures.
		ADVISE-ENTRY gives advice to proc.  advice should be a
		procedure of three arguments.  When proc is invoked,
		advice is passed proc, a list of proc's argument
		values, and the current environment.
End-Entry:	ADVISE-ENTRY

Begin-Entry:	ADVISE-EXIT
Syntax:		(ADVISE-EXIT proc advice)
Args:		2 args
Type:		Procedure
Description:	The general exit-advising procedure.  TRACE-EXIT and
		BREAK-EXIT are implemented as calls to ADVISE-EXIT.
		advice should accept four arguments: proc, its
		argument values, the result computed by proc, and the
		current environment.  advice is responsible for
		returning the value produced by proc.
End-Entry:	ADVISE-EXIT

Begin-Entry:	ADVICE
Syntax:		(ADVICE proc)
Args:		1 arg
Type:		Procedure
Description:	Returns the advice, if any, given to proc.
Example:	(DEFINE (ID X) X)	=> ID
Example:	(ADVICE ID)		=> NIL
Example:	(TRACE-ENTRY ID)	=> (ID)
Example:	(ADVICE ID)		=> (TRACE-ENTRY-ADVICE)
End-Entry:	ADVICE

Begin-Entry:	UNADVISE-ENTRY
Syntax:		(UNADVISE-ENTRY proc)
Args:		1 arg
Type:		Procedure
Description:	Removes entry advice from proc.
End-Entry:	UNADVISE-ENTRY

Begin-Entry:	UNADVISE-EXIT
Syntax:		(UNADVISE-EXIT proc)
Args:		1 arg
Type:		Procedure
Description:	Removes exit advice from proc.
End-Entry:	UNADVISE-EXIT

Begin-Entry:	UNADVISE
Syntax:		(UNADVISE proc)
Args:		1 arg
Type:		Procedure
Description:	Removes all advice from proc -- a combination of
		UNADVISE-ENTRY and UNADVISE-EXIT.
End-Entry:	UNADVISE

End-Family:	Advising Procedures

Page-Break:

Begin-Family:   Debugging Features

Description:    An important step in debugging is to locate the piece of code
                from which the error is signalled. The SCHEME debugger contains
                a history examiner and an environment examiner to aid the user
                in locating a bug.

Begin-Entry:	SETUP-HISTORY
Syntax:		(SETUP-HISTORY l r x)
Args:		3 args
Type:		Procedure
Description:	Initializes the history recording mechanism setting the maximum
                number of sub-problem levels to be l, the maximum number of reductions
                at each level to be r, and the maximum number of sub-expressions
                to be x. These arguments are referred in the read-eval-print
                loop as max-subproblems max-reductions and max-subexpressions
                respectively.
End-Entry:	SETUP-HISTORY

Begin-Entry:    DEBUG
Syntax:         (DEBUG)
Args:           0 args
Description:    The function DEBUG gets the user into the history examination
                system, which allows the user to examine the history of
                execution of an expression after it has been executed. The
                environment of any procedure application may then be examined
                and the interrupted process may be proceeded from any of the
                displayed nodes of evaluation.
                The history system has two modes. The first time the debugger
                is called, it enters the LAZY-MODE, but enters the last mode
                called  every subsequent time. In the LAZY-MODE, a
                read-execute-print loop is entered and single letter commands
                are available. The NORMAL-MODE is the more complex and complete
                of the two, in which a special READ-EVAL-PRINT is entered so
                that all the internal functions and variables of the history
                system are available to the user, who can write his own display
                and manipulation procedures.
                The commands in LAZY-MODE call procedures, available in
                NORMAL-MODE, to display and move around in the evaluation tree
                of the expression. The different commands are listed and explained
                in the DEC-20 Manual.
                The function TOGGLE (or the command M) can be used to change
                from one mode to the other.
End-Entry:      DEBUG

Begin-Entry:    WHERE
Syntax:         (WHERE)
Args:           0 args
Description:    The function WHERE gets the user into the environment examination
                system of the debugger. This allows the user to examine variable
                bindings in an environment, or any of its parent frames and to
                change these bindings by entering a read-eval-print loop in the
                appropriate environment.
                WHERE enters a read-execute-print loop which consists of one
                letter commands. The different commands are listed and explained
                in the DEC-20 Manual. WHERE can also be called from the history
                examination system.
End-Entry:      WHERE

End-Family:     Debugging Features

Chapter:	Reading and Printing

Begin-Family:	Essential Knowledge

Begin-Entry:	READ
Syntax:		(READ)
Args:		1 arg
Type:		Procedure
Description:	Reads one expression from the terminal and returns it as a
		value.
End-Entry:	READ

Begin-Entry:	PRINT
Syntax:		(PRINT value)
Args:		1 arg
Type:		Procedure
Description:	This is the normal LISP printer.  It puts out a carriage-return, then
		prints out value, then puts out a space:

			(DEFINE (PRINT X)
			   (NEWLINE)
			   (PRINC X)
			   (PRINC " "))
End-Entry:	PRINT

Begin-Entry:	NEWLINE
Syntax:		(NEWLINE)
Args:		No args
Type:		Procedure
Description:	Types a carriage return on the console.
End-Entry:	NEWLINE

Begin-Entry:	PRINC
Syntax:		(PRINC value)
Args:		1 arg
Type:		Procedure
Description:	Prints value on the console.
End-Entry:	PRINC

Begin-Entry:    %IN
Syntax:         (%IN)
Args:           0 args
Type:           Procedure
Description:    Returns the most recently read in expression.
Example:        (+ 2 5)           => 7
Example:        (%IN)             => (+ 2 5)
End-Entry:      %IN

Begin-Entry:    %OUT
Syntax:         (%OUT)
Args:           0 args
Type:           Procedure
Description:    Returns the most recently printed expression.
Example:        (+ 2 5)           => 7
Example:        (%OUT)            => 7
End-Entry:      %OUT

End-Family:	Essential Knowledge

Page-Break:

Begin-Family:	Advanced Knowledge

Begin-Entry:	TYI
Syntax:		(TYI)
Args:	        1 arg
Type:		Procedure
Description:	Reads a character from the current input source and returns the
		character's ASCII code, an integer.
End-Entry:	TYI

Begin-Entry:	TYO
Syntax:		(TYO n)
Args:		1 arg
Type:		Procedure
Description:	Types the character whose ascii value is n on the console.
End-Entry:	TYO

Begin-Entry:	READCH
Syntax:		(READCH)
Args:	        1 arg
Type:		Procedure
Description:	Reads a character from the terminal and returns it as a symbol.
End-Entry:	READCH

Begin-Entry:	PEEKCH
Syntax:		(PEEKCH)
Args:		No args
Type:		Procedure
Description:	Peeks at a character from the terminal, without
		actually reading it, and returns it as a symbol.
End-Entry:	PEEKCH

Begin-Entry:	TYIPEEK
Syntax:		(TYIPEEK)
Args:		No args
Type:		Procedure
Description:	Peeks at a character from the current input source
		without actually reading it.  Returns the character
		code, an integer.
End-Entry:	TYIPEEK

Begin-Entry:	CHAR
Syntax:		(CHAR n)
Args:		1 arg
Type:		Procedure
Description:	Returns the ascii character (symbol) whose ASCII code is n.
Example:	(CHAR 65)	=> A
End-Entry:	CHAR

Begin-Entry:	ASCII
Syntax:		(ASCII sym)
Args:		1 arg
Description:	Returns the ASCII code of the character (symbol) sym.
Example:	(ASCII 'A)	=> 65
End-Entry:	ASCII

End-Family:	Advanced Knowledge

Begin-Family:	Printer Control

Description: 	The printer has two adjustable parameters:  the value of the
		global variable *PRINT-DEPTH* is the maximum
		depth to which lists are printed; lists nested deeper than
		*PRINT-DEPTH* levels will be abbreviated when printed.  The
		value of *PRINT-BREADTH* is the maximum number of elements of a
		list which will be printed; lists longer than *PRINT-BREADTH*
		will be abbreviated when printed.  Initially, these variables
		have very tolerant values.  You may assign their values as
		desired, but they must be integers (or NIL, which puts no
                restriction on the printer).

End-Family:	Printer Control




Chapter:	Advanced Special Forms

Begin-Family:   Evaluation and Application

Begin-Entry:	EVAL

SpecialForm:	(EVAL exp env)
Args:		2 args
Description:	EVALuates exp in the environment env.  Forces another evaluation of exp.
End-Entry:	EVAL

Begin-Entry:    APPLY
SpecialForm:    (APPLY fn arglist)
Description:    Applies fn to arglist, the list of arguments, returning the
                resulting value. The variable "fn" must be an applicable object
                such as a procedure.
Example:        (APPLY CAR '((A B)))                      => A
Example:        (APPLY (LAMBDA (X Y) (+ X Y 1)) '(3 4))   => 8
End-Entry:      APPLY

End-Family:     Evaluation and Application

Page-Break:

Begin-Family:   Environments

Begin-Entry:    MAKE-ENVIRONMENT
SpecialForm:    (MAKE-ENVIRONMENT exp1 exp2 ...)
Description:    MAKE-ENVIRONMENT produces a new environment which is contained
                statically in the environment in which MAKE-ENVIRONMENT is
                called . The new environment contains any variables DEFINEd
                by the expressions exp1, exp2 ...
End-Entry:      MAKE-ENVIRONMENT

Begin-Entry:	ACCESS
SpecialForm:    (ACCESS sym env)
Description:    ACCESS retrieves the value of sym in the environment env.
Demo:           (DEFINE RECT-PACKAGE
                  (MAKE-ENVIRONMENT
		    (DEFINE (MAKE-COMPLEX-RECTANGULAR REAL IMAG)
		      (LIST REAL IMAG))
                    (DEFINE (REAL-PART Z) (CAR Z))
                    (DEFINE (IMAG-PART Z) (CADR Z)) ...))
		RECT-PACKAGE
		(DEFINE Z ((ACCESS MAKE-COMPLEX-RECTANGULAR RECT-PACKAGE) 3 4))
		Z
		((ACCESS IMAG-PART RECT-PACKAGE) Z)
		4
End-Entry:      ACCESS

Begin-Entry:    FRAME-PROCEDURE
Syntax:         (FRAME-PROCEDURE env)
Args:		1 arg
Type:		Procedure
Description:    FRAME-PROCEDURE returns the procedure object which was applied
                to produce the environment env.
End-Entry:      FRAME-PROCEDURE

Begin-Entry:    FRAME-BINDINGS
Syntax:         (FRAME-BINDINGS env)
Args:		1 arg
Type:		Procedure
Description:    FRAME-BINDINGS returns the association list representing the
                bindings of the variables to their values in the environment
                env.
End-Entry:      FRAME-BINDINGS

Begin-Entry:    FRAME-PARENT
Syntax:         (FRAME-PARENT env)
Args:		1 arg
Type:		Procedure
Description:    FRAME-PARENT returns the environment in which the environment


                env was created.
End-Entry:      FRAME-PARENT

End-Family:     Environments



Index:

Eof: